/* Práctica 3a */
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/shm.h>
#include <time.h>

#define MAXNUMHIJOS 50

int main(int argc, char *argv[])
{
    char seleccion;
    int pid;
    int tiempo_aleatorio;
    int status = 0;
    int indice, i;

    int KEY;
    int id;
    int *ctrl;
    KEY = ftok(".",'z');
    id = shmget(KEY, (MAXNUMHIJOS + 1)*sizeof(int), IPC_CREAT|0666);
    if(id < 0)
    {
        printf("Error en el shmget\n");
        exit(-1);
    }
    ctrl = (int *)shmat(id,0,0);
    ctrl[0] = 0;
    /* Mostrar un menú */
        printf("----- Selecionar una opción --------\n");
        printf("'n' - Crear un proceso hijo.\n");
        printf("'w' - Wait.\n");
        printf("'f' - finalizar el programa.\n");
        printf("-------------------------------------\n");
        printf("tú selección: \n");

    while(1)
    {
        read(0,&seleccion,1);

        if (seleccion == 'n') /* Crear un proceso hijo */
        {
            pid = fork();
            if(pid == 0) /* Proceso hijo */
            {
                ctrl[0] ++ ;
                indice = ctrl[0];
                ctrl[indice] = getpid();
                printf("Soy un proceso hijo.\n");
                printf("mi PID es => %d\n",getpid());
                /* Generar un número entre 1 y 15 */
                srand ( time(NULL) );
                tiempo_aleatorio = rand() % 15 + 1;
                printf("Voy a morir dentro de %d segundos.\n",tiempo_aleatorio);
                sleep(tiempo_aleatorio);
                printf("Soy el hijo con PID = %d . Estoy muerto.\n",getpid());
                exit(status);
            }
        }
        else if (seleccion == 'w')
        {
            waitpid(pid,&status,0);
        }
        else if (seleccion == 'f')
        {
            indice = ctrl[0];
            for(i = 1; i <= indice; i ++)
            {
                waitpid(ctrl[i],&status,0);
            }
            shmctl(id,IPC_RMID,0);
            exit (0);
        }
        else {;}
    }

    shmctl(id,IPC_RMID,0);
    return 0;
}
